package com.itany.shop.service.impl;

import com.itany.shop.dao.ProductDao;
import com.itany.shop.entity.Item;
import com.itany.shop.entity.Product;
import com.itany.shop.exception.ParameterErrorException;
import com.itany.shop.exception.ProductNotExistException;
import com.itany.shop.exception.UserNotLoginException;
import com.itany.shop.factory.ObjectFactory;
import com.itany.shop.service.CartService;
import com.itany.shop.vo.Cart;

import java.util.List;

/**
 * @author 石小俊
 * @date 2023年06月07日 9:55
 */
public class CartServiceImpl implements CartService {

    private ProductDao productDao = (ProductDao) ObjectFactory.getObject("productDao");

    @Override
    public void addCart(Cart cart, Integer id) throws UserNotLoginException, ParameterErrorException, ProductNotExistException {
        if(null == cart){
            throw new UserNotLoginException("请先登录");
        }
        if(id == null){
            throw new ParameterErrorException("请求参数有误");
        }
        // 根据主键查询当前商品信息
        Product product = productDao.selectById(id);
        if(null == product){
            // 如果没有查询到对应商品,说明传递的主键值有误
            throw new ProductNotExistException("该编号所对应的商品不存在,请检查编号是否正确");
        }

        // 加入购物车时有两种场景
        // 1.当前购物车中已经存在该商品
        // 2.当前购物车中尚未存在该商品
        // 不同的场景,业务处理也不一致
        // 可以通过遍历当前购物车中已有的所有明细进行判断
        // 获取当前购物车中所有明细信息
        List<Item> items = cart.getItems();
        // 遍历这些明细
        for(Item item : items){
            // 如果明细中商品的主键与当前商品的主键一致,则表示已经存在该商品
            if(item.getProduct().getId().equals(product.getId())){
                // 此时购物车发生如下变化
                // 1.明细数量=原来的数量+1
                item.setNum(item.getNum()+1);
                // 对于商品,可能存在价格变化的场景
                // 我们当前购物车中存在的商品后期价格可能会发生变化

                // 获取明细总价发生变化之前的总价
                Double oldPrice = item.getPrice();
                // 2.明细总价=当前明细数量*当前商品单价
                item.setPrice(item.getNum() * product.getPrice());
                // 获取明细总价发生变化之后的总价
                Double newPrice = item.getPrice();
                // 3.购物车总价=当前购物车总价-原来的明细总价+现在的明细总价
                cart.setPrice(cart.getPrice() - oldPrice + newPrice);
                return;
            }
        }

        // 如果明细中不存在新增的商品
        // 此时购物车发生如下变化
        // 1.新增一条明细信息
        Item item = new Item();
        // 新增的明细数量=1
        item.setNum(1);
        // 新增的明细总价=商品单价
        item.setPrice(product.getPrice());
        // 新增的商品就是当前查询的商品
        item.setProduct(product);
        // 将新增的明细存入到购物车中
        cart.addItem(item);
        // 2.购物车总价=原来的购物车总价+当前商品单价
        cart.setPrice(cart.getPrice()+product.getPrice());
    }
}
